|
RAIS
3.2
|
00001 using System; 00002 using System.Collections.Generic; 00003 using System.Text; 00004 using System.Xml; 00005 using System.IO; 00006 00007 namespace RAIS.Common 00008 { 00009 public class SpecificReport 00010 { 00011 #region FIELDS 00012 private XmlDocument xmlReport; 00013 private XmlNamespaceManager manager; 00014 private Dictionary<XmlNode, SpecificReportFieldType> reportFields; 00015 private List<XmlNode> reportImages; 00016 private int reportID; 00017 #endregion 00018 00019 #region PROPERTIES 00020 public enum SpecificReportFieldType 00021 { 00022 Textbox, 00023 List, 00024 Table, 00025 Subreport, 00026 Image 00027 }; 00028 public Dictionary<string, SpecificReportFieldType> _ReportFields 00029 { 00030 get 00031 { 00032 Dictionary<string, SpecificReportFieldType> result = new Dictionary<string, SpecificReportFieldType>(); 00033 foreach (KeyValuePair<XmlNode, SpecificReportFieldType> pair in reportFields) 00034 { 00035 XmlNode reportFieldNode = pair.Key; 00036 SpecificReportFieldType reportFieldType = pair.Value; 00037 result.Add(reportFieldNode.Attributes["Name"].Value.ToString(), reportFieldType); 00038 } 00039 return result; 00040 } 00041 } 00042 public List<string> _ReportImages 00043 { 00044 get 00045 { 00046 List<string> result = new List<string>(); 00047 foreach (XmlNode imageNode in reportImages) 00048 { 00049 result.Add(imageNode.Attributes["Name"].Value); 00050 } 00051 return result; 00052 } 00053 } 00054 public int SpecificReportID { get { return this.reportID; } } 00055 #endregion 00056 00057 // Constructor 00058 public SpecificReport(int reportID, string reportDefinition) 00059 { 00060 this.reportID = reportID; 00061 reportFields = new Dictionary<XmlNode, SpecificReportFieldType>(); 00062 reportImages = new List<XmlNode>(); 00063 loadReport(reportDefinition); 00064 } 00065 00066 #region PRIVATE METHODS 00067 private void loadReport(string reportDefinition) 00068 { 00069 xmlReport = new XmlDocument(); 00070 xmlReport.LoadXml(reportDefinition); 00071 manager = new XmlNamespaceManager(xmlReport.NameTable); 00072 manager.AddNamespace("def", xmlReport.DocumentElement.NamespaceURI); 00073 00074 #region INIT REPORT FIELDS 00075 // Init textboxes 00076 XmlNodeList nodes = xmlReport.GetElementsByTagName("Textbox"); 00077 foreach (XmlNode node in nodes) 00078 { 00079 if (node.Attributes["Name"] != null) 00080 { 00081 XmlNode valueNode = xmlReport.SelectSingleNode("//def:Textbox[@Name='" + node.Attributes["Name"].Value + "']/def:Value", manager); 00082 if (valueNode != null && (String.IsNullOrEmpty(valueNode.InnerText) || valueNode.InnerText.StartsWith("=Fields!"))) 00083 reportFields.Add(node, SpecificReportFieldType.Textbox); 00084 } 00085 } 00086 // Init lists 00087 nodes = xmlReport.GetElementsByTagName("List"); 00088 foreach (XmlNode node in nodes) 00089 { 00090 if (node.Attributes["Name"] != null) 00091 { 00092 reportFields.Add(node, SpecificReportFieldType.List); 00093 } 00094 } 00095 // Init tables 00096 nodes = xmlReport.GetElementsByTagName("Table"); 00097 foreach (XmlNode node in nodes) 00098 { 00099 if (node.Attributes["Name"] != null) 00100 { 00101 reportFields.Add(node, SpecificReportFieldType.Table); 00102 } 00103 } 00104 // Init subreports 00105 nodes = xmlReport.GetElementsByTagName("Subreport"); 00106 foreach (XmlNode node in nodes) 00107 { 00108 if (node.Attributes["Name"] != null) 00109 { 00110 reportFields.Add(node, SpecificReportFieldType.Subreport); 00111 } 00112 } 00113 #endregion 00114 00115 #region INIT REPORT IMAGES 00116 nodes = xmlReport.GetElementsByTagName("Image"); 00117 foreach (XmlNode node in nodes) 00118 { 00119 if (node.Attributes["Name"] != null) 00120 { 00121 reportImages.Add(node); 00122 } 00123 } 00124 #endregion 00125 } 00126 private string writeXmlToString() 00127 { 00128 StringWriter sw = new StringWriter(); 00129 XmlTextWriter xw = new XmlTextWriter(sw); 00130 xmlReport.WriteTo(xw); 00131 return sw.ToString(); 00132 } 00133 private bool isPartOfTableGrouping(string reportField) 00134 { 00135 XmlNode node = xmlReport.SelectSingleNode("//def:Table/def:TableGroups/def:TableGroup/def:Header/def:TableRows/def:TableRow/def:TableCells/def:TableCell/def:ReportItems/def:Textbox[@Name='" + reportField + "']", manager); 00136 if (node != null) 00137 return true; 00138 else return false; 00139 } 00140 private bool hasTableGrouping(XmlNode tableNode) 00141 { 00142 XmlNode node = tableNode.SelectSingleNode("//def:TableGroups", manager); 00143 if (node != null) 00144 return true; 00145 else return false; 00146 } 00147 #endregion 00148 00149 #region PUBLIC METHODS 00150 public string GetFieldConnection(string reportField, string queryField) 00151 { 00152 XmlNode valueNode = xmlReport.SelectSingleNode("//def:Textbox[@Name='" + reportField + "']/def:Value", manager); 00153 if (valueNode != null) 00154 { 00155 if (queryField != String.Empty) 00156 valueNode.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value"; 00157 else 00158 valueNode.InnerText = String.Empty; 00159 } 00160 return writeXmlToString(); 00161 } 00162 public string GetFieldConnection(string reportField, string queryField, bool tableGrouping) 00163 { 00164 XmlNode valueNode = xmlReport.SelectSingleNode("//def:Textbox[@Name='" + reportField + "']/def:Value", manager); 00165 if (valueNode != null) 00166 { 00167 if (queryField != String.Empty) 00168 valueNode.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value"; 00169 else 00170 valueNode.InnerText = String.Empty; 00171 } 00172 00173 XmlNode rowNode = valueNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode; 00174 XmlNode oldRowNodes = rowNode.ParentNode; 00175 if (tableGrouping && !isPartOfTableGrouping(reportField)) 00176 { 00177 XmlAttribute att = xmlReport.CreateAttribute("PrevGroup"); 00178 att.Value = rowNode.ParentNode.ParentNode.Name; 00179 rowNode.Attributes.Append(att); 00180 00181 XmlNode tableRows = null; 00182 XmlNode tableNode = rowNode.ParentNode.ParentNode.ParentNode; 00183 if (!hasTableGrouping(tableNode)) 00184 { 00185 XmlNode tableGroups = xmlReport.CreateElement("TableGroups", tableNode.NamespaceURI); 00186 XmlNode tableGroup = xmlReport.CreateElement("TableGroup", tableGroups.NamespaceURI); 00187 XmlNode grouping = xmlReport.CreateElement("Grouping", tableGroup.NamespaceURI); 00188 XmlAttribute groupingName = xmlReport.CreateAttribute("Name"); 00189 groupingName.Value = reportField + "_Grouping"; 00190 XmlNode groupExpressions = xmlReport.CreateElement("GroupExpressions", grouping.NamespaceURI); 00191 XmlNode groupExpression = xmlReport.CreateElement("GroupExpression", groupExpressions.NamespaceURI); 00192 XmlNode pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", grouping.NamespaceURI); 00193 pageBreakNode.InnerText = "false"; 00194 00195 groupExpressions.AppendChild(groupExpression); 00196 grouping.AppendChild(groupExpressions); 00197 grouping.AppendChild(pageBreakNode); 00198 grouping.Attributes.Append(groupingName); 00199 tableGroup.AppendChild(grouping); 00200 tableGroups.AppendChild(tableGroup); 00201 tableNode.AppendChild(tableGroups); 00202 } 00203 00204 tableRows = tableNode.SelectSingleNode("//def:TableGroups/def:TableGroup/def:Header/def:TableRows", manager); 00205 if (tableRows == null) 00206 { 00207 XmlNode tableGroup = tableNode.SelectSingleNode("//def:TableGroups/def:TableGroup", manager); 00208 XmlNode header = xmlReport.CreateElement("Header", tableGroup.NamespaceURI); 00209 tableRows = xmlReport.CreateElement("TableRows", header.NamespaceURI); 00210 00211 header.AppendChild(tableRows); 00212 tableGroup.AppendChild(header); 00213 } 00214 tableRows.AppendChild(rowNode); 00215 00216 if (oldRowNodes.ChildNodes.Count == 0) 00217 tableNode.RemoveChild(oldRowNodes.ParentNode); 00218 } 00219 else if (!tableGrouping && isPartOfTableGrouping(reportField)) 00220 { 00221 string prevGroup = rowNode.Attributes["PrevGroup"].Value; 00222 XmlNode tableNode = rowNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode; 00223 XmlNode tableRows = tableNode.SelectSingleNode("//def:Table/def:" + prevGroup + "/def:TableRows", manager); 00224 00225 if (tableRows != null) 00226 { 00227 tableRows.InsertBefore(rowNode, tableRows.FirstChild); 00228 } 00229 else 00230 { 00231 XmlNode groupNode = xmlReport.CreateElement(prevGroup, tableNode.NamespaceURI); 00232 tableRows = xmlReport.CreateElement("TableRows", groupNode.NamespaceURI); 00233 tableRows.AppendChild(rowNode); 00234 groupNode.AppendChild(tableRows); 00235 tableNode.AppendChild(groupNode); 00236 } 00237 if (oldRowNodes.ChildNodes.Count == 0) 00238 tableNode.SelectSingleNode("//def:TableGroups/def:TableGroup", manager).RemoveChild(oldRowNodes.ParentNode); 00239 } 00240 return writeXmlToString(); 00241 } 00242 public string GetListConnection(string reportField, string queryField, bool pageBreak) 00243 { 00244 foreach (KeyValuePair<XmlNode, SpecificReportFieldType> pair in reportFields) 00245 { 00246 XmlNode reportFieldNode = pair.Key; 00247 if (pair.Value == SpecificReportFieldType.List && reportFieldNode.Attributes["Name"].Value.Equals(reportField)) 00248 { 00249 foreach (XmlNode node in reportFieldNode.ChildNodes) 00250 { 00251 if (node.Name.Equals("Grouping")) 00252 { 00253 reportFieldNode.RemoveChild(node); 00254 } 00255 } 00256 if (queryField != String.Empty) 00257 { 00258 XmlNode groupingNode = xmlReport.CreateElement("Grouping", reportFieldNode.NamespaceURI); 00259 XmlAttribute groupingName = xmlReport.CreateAttribute("Name"); 00260 groupingName.Value = reportField + "_Grouping"; 00261 XmlNode pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", groupingNode.NamespaceURI); 00262 pageBreakNode.InnerText = pageBreak.ToString().ToLower(); 00263 XmlNode groupExpressions = xmlReport.CreateElement("GroupExpressions", groupingNode.NamespaceURI); 00264 XmlNode groupExpression = xmlReport.CreateElement("GroupExpression", groupExpressions.NamespaceURI); 00265 00266 groupExpression.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value"; 00267 00268 groupExpressions.AppendChild(groupExpression); 00269 groupingNode.AppendChild(groupExpressions); 00270 groupingNode.Attributes.Append(groupingName); 00271 groupingNode.AppendChild(pageBreakNode); 00272 reportFieldNode.AppendChild(groupingNode); 00273 } 00274 break; 00275 } 00276 } 00277 return writeXmlToString(); 00278 } 00279 public string GetTableConnection(string reportField, string queryField, bool pageBreak) 00280 { 00281 string query = "//def:Table[@Name='" + reportField + "']"; 00282 XmlNode tableNode = xmlReport.SelectSingleNode(query, manager); 00283 00284 if (queryField != String.Empty) 00285 { 00286 if (xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression", manager) != null) 00287 { 00288 XmlNode groupExpression = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression", manager); 00289 groupExpression.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value"; 00290 00291 XmlNode pageBreakNode = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:PageBreakAtEnd", manager); 00292 if (pageBreakNode != null) 00293 pageBreakNode.InnerText = pageBreak.ToString().ToLower(); 00294 else 00295 { 00296 XmlNode grouping = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping", manager); 00297 pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", grouping.NamespaceURI); 00298 pageBreakNode.InnerText = pageBreak.ToString().ToLower(); 00299 grouping.AppendChild(pageBreakNode); 00300 } 00301 } 00302 else 00303 { 00304 XmlNode tableGroups = xmlReport.CreateElement("TableGroups", tableNode.NamespaceURI); 00305 XmlNode tableGroup = xmlReport.CreateElement("TableGroup", tableGroups.NamespaceURI); 00306 XmlNode grouping = xmlReport.CreateElement("Grouping", tableGroup.NamespaceURI); 00307 XmlAttribute groupingName = xmlReport.CreateAttribute("Name"); 00308 groupingName.Value = reportField + "_Grouping"; 00309 XmlNode groupExpressions = xmlReport.CreateElement("GroupExpressions", grouping.NamespaceURI); 00310 XmlNode groupExpression = xmlReport.CreateElement("GroupExpression", groupExpressions.NamespaceURI); 00311 groupExpression.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value"; 00312 XmlNode pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", grouping.NamespaceURI); 00313 pageBreakNode.InnerText = pageBreak.ToString().ToLower(); 00314 //XmlNode header = xmlReport.CreateElement("Header", tableGroup.NamespaceURI); 00315 //XmlNode tableRows = xmlReport.CreateElement("TableRows", header.NamespaceURI); 00316 00317 //header.AppendChild(tableRows); 00318 groupExpressions.AppendChild(groupExpression); 00319 grouping.AppendChild(groupExpressions); 00320 grouping.AppendChild(pageBreakNode); 00321 grouping.Attributes.Append(groupingName); 00322 tableGroup.AppendChild(grouping); 00323 //tableGroup.AppendChild(header); 00324 tableGroups.AppendChild(tableGroup); 00325 tableNode.AppendChild(tableGroups); 00326 } 00327 } 00328 else 00329 { 00330 if (xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression", manager) != null) 00331 { 00332 XmlNode groupExpression = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression", manager); 00333 groupExpression.InnerText = String.Empty; 00334 00335 XmlNode pageBreakNode = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:PageBreakAtEnd", manager); 00336 if (pageBreakNode != null) 00337 pageBreakNode.InnerText = pageBreak.ToString().ToLower(); 00338 else 00339 { 00340 XmlNode grouping = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping", manager); 00341 pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", grouping.NamespaceURI); 00342 pageBreakNode.InnerText = pageBreak.ToString().ToLower(); 00343 grouping.AppendChild(pageBreakNode); 00344 } 00345 } 00346 } 00347 return writeXmlToString(); 00348 } 00349 public string GetSubreportConnection(string reportField, string specificReportName) 00350 { 00351 XmlNode node = xmlReport.SelectSingleNode("//def:Subreport[@Name='" + reportField + "']/def:ReportName", manager); 00352 if (node != null) 00353 { 00354 node.InnerText = specificReportName; 00355 } 00356 return writeXmlToString(); 00357 } 00358 public string GetConnectedDataField(string reportField, SpecificReportFieldType type, ref bool cbxChecked) 00359 { 00360 if (type == SpecificReportFieldType.Textbox) 00361 { 00362 foreach (KeyValuePair<XmlNode, SpecificReportFieldType> pair in reportFields) 00363 { 00364 XmlNode reportFieldNode = pair.Key; 00365 if (reportFieldNode.Attributes["Name"].Value.Equals(reportField)) 00366 { 00367 foreach (XmlNode childNode in reportFieldNode.ChildNodes) 00368 { 00369 if (childNode.Name.Equals("Value")) 00370 { 00371 if (isPartOfTableGrouping(reportField)) 00372 cbxChecked = true; 00373 if (childNode.InnerText.StartsWith("=Fields!")) 00374 return childNode.InnerText.Substring(childNode.InnerText.IndexOf('!') + 1, childNode.InnerText.Length - 14).Replace('_', ' '); 00375 else 00376 break; 00377 } 00378 } 00379 break; 00380 } 00381 } 00382 } 00383 else if (type == SpecificReportFieldType.List) 00384 { 00385 string result = String.Empty; 00386 foreach (KeyValuePair<XmlNode, SpecificReportFieldType> pair in reportFields) 00387 { 00388 XmlNode reportFieldNode = pair.Key; 00389 if (reportFieldNode.Attributes["Name"].Value.Equals(reportField)) 00390 { 00391 foreach (XmlNode groupingNode in reportFieldNode.ChildNodes) 00392 { 00393 if (groupingNode.Name.Equals("Grouping")) 00394 { 00395 foreach (XmlNode childNode in groupingNode.ChildNodes) 00396 { 00397 if (childNode.Name.Equals("GroupExpressions")) 00398 result = childNode.ChildNodes[0].InnerText.Substring(childNode.InnerText.IndexOf('!') + 1, childNode.InnerText.Length - 14).Replace('_', ' '); 00399 else if (childNode.Name.Equals("PageBreakAtEnd")) 00400 cbxChecked = Convert.ToBoolean(childNode.InnerText); 00401 } 00402 } 00403 } 00404 } 00405 } 00406 return result; 00407 } 00408 else if (type == SpecificReportFieldType.Table) 00409 { 00410 string query = "//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression"; 00411 XmlNode groupExpression = xmlReport.SelectSingleNode(query, manager); 00412 if (groupExpression != null && groupExpression.InnerText.Length > 0) 00413 { 00414 string result = groupExpression.InnerText.Substring(groupExpression.InnerText.IndexOf('!') + 1, groupExpression.InnerText.Length - 14).Replace('_', ' '); 00415 query = "//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:PageBreakAtEnd"; 00416 XmlNode pageBreakNode = xmlReport.SelectSingleNode(query, manager); 00417 if (pageBreakNode != null) 00418 cbxChecked = Convert.ToBoolean(pageBreakNode.InnerText); 00419 return result; 00420 } 00421 } 00422 else if (type == SpecificReportFieldType.Subreport) 00423 { 00424 string query = "//def:Subreport[@Name='" + reportField + "']/def:ReportName"; 00425 XmlNode node = xmlReport.SelectSingleNode(query, manager); 00426 //if (node != null) 00427 return node.InnerText; 00428 } 00429 return null; 00430 } 00431 public SpecificReportFieldType GetFieldTypeFromString(string type) 00432 { 00433 switch (type) 00434 { 00435 case "List": 00436 return SpecificReportFieldType.List; 00437 case "Table": 00438 return SpecificReportFieldType.Table; 00439 case "Subreport": 00440 return SpecificReportFieldType.Subreport; 00441 case "Image": 00442 return SpecificReportFieldType.Image; 00443 } 00444 return SpecificReportFieldType.Textbox; 00445 } 00446 public bool IsPartOfTable(string reportField) 00447 { 00448 string query = "//def:Textbox[@Name='" + reportField + "']"; 00449 XmlNode textboxNode = xmlReport.SelectSingleNode(query, manager); 00450 if (textboxNode.ParentNode.ParentNode.Name.Equals("TableCell")) 00451 return true; 00452 else return false; 00453 } 00454 #endregion 00455 } 00456 }